import os
import re
import tkinter as tk
from tkinter import filedialog, messagebox


class TsFileNameFormatter:
    def __init__(self, root):
        self.root = root
        self.root.title("TS文件名补零工具")
        self.root.geometry("450x200")  # 窗口大小
        self.root.resizable(False, False)  # 禁止调整窗口大小

        # 存储选择的文件夹路径
        self.folder_path = tk.StringVar()

        # 界面布局
        self.create_widgets()

    def create_widgets(self):
        # 文件夹选择区域
        frame1 = tk.Frame(self.root, padx=20, pady=15)
        frame1.pack(fill=tk.X)

        tk.Label(frame1, text="选择文件夹：", font=("Arial", 10)).pack(side=tk.LEFT, padx=5)
        tk.Entry(frame1, textvariable=self.folder_path, width=35, font=("Arial", 10)).pack(side=tk.LEFT, padx=5)
        tk.Button(frame1, text="浏览", command=self.select_folder, font=("Arial", 10), width=8).pack(side=tk.LEFT)

        # 说明文本
        frame2 = tk.Frame(self.root, padx=20)
        frame2.pack(fill=tk.X)

        tip_text = "功能：将文件夹中.ts文件的数字前缀补零至4位（例：1.ts→0001.ts，999.ts→0999.ts）"
        tk.Label(frame2, text=tip_text, font=("Arial", 9), fg="#666").pack(anchor=tk.W)

        # 操作按钮区域
        frame3 = tk.Frame(self.root, padx=20, pady=25)
        frame3.pack(fill=tk.X)

        tk.Button(frame3, text="开始批量修改", command=self.batch_rename, font=("Arial", 11, "bold"),
                  bg="#4CAF50", fg="white", width=15, height=1).pack(side=tk.LEFT, padx=20)
        tk.Button(frame3, text="退出", command=self.root.quit, font=("Arial", 11),
                  bg="#f44336", fg="white", width=10, height=1).pack(side=tk.LEFT)

    def select_folder(self):
        """选择文件夹并更新路径显示"""
        path = filedialog.askdirectory(title="选择包含.ts文件的文件夹")
        if path:
            self.folder_path.set(path)

    def batch_rename(self):
        """批量修改文件名"""
        folder = self.folder_path.get().strip()

        # 验证文件夹是否存在
        if not os.path.exists(folder):
            messagebox.showerror("错误", "请先选择有效的文件夹！")
            return

        # 正则表达式：匹配 数字.ts 格式的文件名（数字部分在.ts前面）
        # 分组1：数字部分，分组2：.ts后缀
        pattern = re.compile(r'^(\d+)(\.ts)$', re.IGNORECASE)  # re.IGNORECASE 支持 .TS 大写后缀

        modified_count = 0  # 记录修改的文件数
        skipped_count = 0  # 记录跳过的文件数

        try:
            # 遍历文件夹中的所有文件
            for filename in os.listdir(folder):
                # 匹配文件名格式
                match = pattern.match(filename)
                if match:
                    num_part = match.group(1)  # 数字部分
                    suffix = match.group(2)  # 后缀（.ts 或 .TS）

                    # 检查数字部分长度是否不足4位
                    if len(num_part) < 4:
                        # 补零至4位（使用 zfill 自动在前面补0）
                        new_num_part = num_part.zfill(4)
                        new_filename = new_num_part + suffix

                        # 构建原文件路径和新文件路径
                        old_path = os.path.join(folder, filename)
                        new_path = os.path.join(folder, new_filename)

                        # 重命名文件（覆盖原文件）
                        os.rename(old_path, new_path)
                        modified_count += 1
                    else:
                        # 数字部分已满足4位，跳过
                        skipped_count += 1

            # 显示结果提示
            result_msg = f"操作完成！\n修改文件数：{modified_count}\n跳过文件数：{skipped_count}"
            messagebox.showinfo("成功", result_msg)

        except Exception as e:
            # 捕获异常并显示错误信息
            messagebox.showerror("错误", f"操作失败：{str(e)}")


if __name__ == "__main__":
    root = tk.Tk()
    app = TsFileNameFormatter(root)
    root.mainloop()